/*
* Copyright (c) 2010-2016 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
*
*/
package com.evolveum.midpoint.schema;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertTrue;
import java.io.File;
import java.io.IOException;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.validation.Schema;
import javax.xml.validation.Validator;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.schema.SchemaRegistryImpl;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import org.testng.annotations.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.prism.schema.PrismSchema;
import com.evolveum.midpoint.prism.schema.SchemaRegistry;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemObjectsType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
import org.testng.annotations.Test;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.validation.Schema;
import javax.xml.validation.Validator;
import java.io.IOException;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertTrue;
/**
* @author Radovan Semancik
*
*/
public class TestSchemaRegistry {
private static final String FOO_NAMESPACE = "http://example.com/xml/ns/foo";
private static final String USER_EXT_NAMESPACE = "http://example.com/xml/ns/user-extension";
private static final String EXTENSION_SCHEMA_NAMESPACE = "http://midpoint.evolveum.com/xml/ns/test/extension";
/**
* Test whether the midpoint prism context was constructed OK and if it can validate
* ordinary user object.
*/
@Test
public void testBasic() throws SAXException, IOException, SchemaException {
MidPointPrismContextFactory factory = getContextFactory();
PrismContext context = factory.createInitializedPrismContext();
SchemaRegistry reg = context.getSchemaRegistry();
Schema javaxSchema = reg.getJavaxSchema();
assertNotNull(javaxSchema);
// Try to use the schema to validate Jack
// PrismObject<UserType> user = context.parseObject(new File("src/test/resources/common/user-jack.xml"));
// Element document = context.serializeToDom(user);
Document document = DOMUtil.parseFile("src/test/resources/common/user-jack.xml");
Validator validator = javaxSchema.newValidator();
DOMResult validationResult = new DOMResult();
validator.validate(new DOMSource(document), validationResult);
// System.out.println("Validation result:");
// System.out.println(DOMUtil.serializeDOMToString(validationResult.getNode()));
}
@Test
public void testCommonSchema() throws SchemaException, SAXException, IOException {
MidPointPrismContextFactory factory = getContextFactory();
PrismContext context = factory.createInitializedPrismContext();
SchemaRegistry schemaRegistry = context.getSchemaRegistry();
PrismSchema commonSchema = schemaRegistry.findSchemaByNamespace(SchemaConstants.NS_C);
assertNotNull("No parsed common schema", commonSchema);
System.out.println("Parsed common schema:");
System.out.println(commonSchema.debugDump());
// TODO
}
@Test
public void testReferenceInExtension() throws SchemaException, SAXException, IOException {
MidPointPrismContextFactory factory = getContextFactory();
PrismContext context = factory.createInitializedPrismContext();
SchemaRegistry schemaRegistry = context.getSchemaRegistry();
// Common schema should be parsed during creation of the context
((SchemaRegistryImpl) schemaRegistry).loadPrismSchemaResource("schema/extension.xsd");
// Check that the extension schema was loaded
PrismSchema extensionSchema = schemaRegistry.findSchemaByNamespace(EXTENSION_SCHEMA_NAMESPACE);
assertNotNull("Extension schema not parsed", extensionSchema);
ItemDefinition itemDefinition = schemaRegistry.findItemDefinitionByElementName(TestConstants.EXTENSION_USER_REF_ELEMENT);
assertNotNull("userRef element definition was not found", itemDefinition);
System.out.println("UserRef definition:");
System.out.println(itemDefinition.debugDump());
assertEquals("Wrong userRef definition class", PrismReferenceDefinitionImpl.class, itemDefinition.getClass());
}
@Test
public void testUserType() throws Exception {
MidPointPrismContextFactory factory = getContextFactory();
PrismContext context = factory.createInitializedPrismContext();
SchemaRegistry schemaRegistry = context.getSchemaRegistry();
PrismObjectDefinition<UserType> userDefinition = schemaRegistry.findObjectDefinitionByCompileTimeClass(UserType.class);
assertNotNull("No user definition", userDefinition);
System.out.println("testUserType:");
System.out.println(userDefinition.debugDump());
assertFalse("User definition is marked as runtime", userDefinition.isRuntimeSchema());
PrismPropertyDefinition<PolyString> nameDef = userDefinition.findPropertyDefinition(ObjectType.F_NAME);
assertNotNull("No name definition", nameDef);
PrismContainerDefinition extensionDef = userDefinition.findContainerDefinition(UserType.F_EXTENSION);
assertNotNull("No 'extension' definition", extensionDef);
assertTrue("Extension definition is NOT marked as runtime", extensionDef.isRuntimeSchema());
PrismPropertyDefinition<PolyString> givenNameDef = userDefinition.findPropertyDefinition(UserType.F_GIVEN_NAME);
assertNotNull("No givenName definition", givenNameDef);
PrismPropertyDefinition<String> preferredLanguageDef = userDefinition.findPropertyDefinition(UserType.F_PREFERRED_LANGUAGE);
assertNotNull("No preferredLanguage definition", preferredLanguageDef);
PrismReferenceValue preferredLanguageValueEnumerationRef = preferredLanguageDef.getValueEnumerationRef();
assertNotNull("No valueEnumerationRef in preferredLanguage definition", preferredLanguageValueEnumerationRef);
assertEquals("Wrong OID in valueEnumerationRef in preferredLanguage definition",
SystemObjectsType.LOOKUP_LANGUAGES.value(), preferredLanguageValueEnumerationRef.getOid());
assertEquals("Wrong type in valueEnumerationRef in preferredLanguage definition",
LookupTableType.COMPLEX_TYPE, preferredLanguageValueEnumerationRef.getTargetType());
// Just make sure this does not end with NPE or stack overflow
PrismObjectDefinition<UserType> shallowClone = userDefinition.clone();
PrismObjectDefinition<UserType> deepClone = userDefinition.deepClone(false);
PrismObjectDefinition<UserType> ultraDeepClone = userDefinition.deepClone(true);
}
@Test
public void testRoleType() throws Exception {
MidPointPrismContextFactory factory = getContextFactory();
PrismContext context = factory.createInitializedPrismContext();
SchemaRegistry schemaRegistry = context.getSchemaRegistry();
PrismObjectDefinition<RoleType> roleDefinition = schemaRegistry.findObjectDefinitionByCompileTimeClass(RoleType.class);
assertNotNull("No role definition", roleDefinition);
assertFalse("Role definition is marked as runtime", roleDefinition.isRuntimeSchema());
PrismPropertyDefinition nameDef = roleDefinition.findPropertyDefinition(ObjectType.F_NAME);
assertNotNull("No name definition", nameDef);
PrismContainerDefinition extensionDef = roleDefinition.findContainerDefinition(ObjectType.F_EXTENSION);
assertNotNull("No 'extension' definition", extensionDef);
assertTrue("Extension definition is NOT marked as runtime", extensionDef.isRuntimeSchema());
PrismPropertyDefinition identifierDef = roleDefinition.findPropertyDefinition(RoleType.F_IDENTIFIER);
assertNotNull("No identifier definition", identifierDef);
// Just make sure this does not end with NPE or stack overflow
PrismObjectDefinition<RoleType> shallowClone = roleDefinition.clone();
PrismObjectDefinition<RoleType> deepClone = roleDefinition.deepClone(false);
PrismObjectDefinition<RoleType> ultraDeepClone = roleDefinition.deepClone(true);
}
@Test
public void testCommonSchemaAccountType() throws SchemaException, SAXException, IOException {
MidPointPrismContextFactory factory = getContextFactory();
PrismContext context = factory.createInitializedPrismContext();
SchemaRegistry schemaRegistry = context.getSchemaRegistry();
PrismObjectDefinition<ShadowType> accountDef = schemaRegistry.findObjectDefinitionByCompileTimeClass(ShadowType.class);
assertNotNull("No account definition", accountDef);
System.out.println("testCommonSchemaAccountType:");
System.out.println(accountDef.debugDump());
PrismPropertyDefinition nameDef = accountDef.findPropertyDefinition(ShadowType.F_NAME);
assertNotNull("No name definition", nameDef);
PrismContainerDefinition extensionDef = accountDef.findContainerDefinition(ShadowType.F_EXTENSION);
assertNotNull("No 'extension' definition", extensionDef);
assertTrue("'extension' definition is not marked as runtime", extensionDef.isRuntimeSchema());
PrismContainerDefinition attributesDef = accountDef.findContainerDefinition(ShadowType.F_ATTRIBUTES);
assertNotNull("No 'attributes' definition", attributesDef);
assertTrue("'attributes' definition is not marked as runtime", attributesDef.isRuntimeSchema());
}
private MidPointPrismContextFactory getContextFactory() {
return new MidPointPrismContextFactory();
}
}